home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 November / EnigmA AMIGA RUN 02 (1995)(G.R. Edizioni)(IT)[!][issue 1995-11][Skylink CD].iso / earcd / ead / ead16.dms / ead16.adf / Listati / Memtool.a < prev    next >
Text File  |  1989-06-13  |  9KB  |  263 lines

  1. *******************************************************************
  2. * Programma.......... Memtool.a
  3. * Autore............. Henrik Clausen
  4. * Versione .......... 1.1I - Giugno 1989
  5. * Linguaggio ........ Assembler 68000
  6. * Scopo ............. Visualizza memoria libera in finestra
  7. * Hardware .......... Amiga 512K, Kickstart V1.2/1.3
  8. * Software .......... Hisoft DevPac V2.13 od altro assemblatore
  9. * Note .............. Traduzione ed adattamento di L. R. Callegari
  10. * ................... Eliminato bug deallocazione memoria difettosa
  11. *******************************************************************
  12.  
  13. * La prima linea è esclusiva di DevPac e consente di indicare la
  14. * directory di ricerca dei files di inclusione, secondo i nomi di
  15. * volume e directory del nostro ambiente assembler.
  16.             
  17.    INCDIR  "Work:Assem/Include/"
  18.  
  19. * Includiamo i files necessari, compresi quelli con gli offset di
  20. * chiamata in libreria (xxxx_lib.i) che consentono di generare un
  21. * file eseguibile senza dovere passare dal linker.
  22.  
  23.    INCLUDE "intuition/intuition.i"
  24.    INCLUDE "graphics/text.i"
  25.    INCLUDE "graphics/rastport.i"
  26.    INCLUDE "libraries/dos.i"
  27.    INCLUDE "exec/exec_lib.i"
  28.    INCLUDE "intuition/intuition_lib.i"
  29.    INCLUDE "graphics/graphics_lib.i"
  30.    INCLUDE "libraries/dos_lib.i"
  31.    INCLUDE "misc/easystart.i"
  32.  
  33. AbsExecBase EQU $4              ; Indirizzo di ExecBase
  34.  
  35.    lea      DosName,a1          ; A1 = nome libreria DOS
  36.    clr.l    d0                  ; Qualunque versione
  37.    movea.l  AbsExecBase,a6      ; A6 = ExecBase
  38.    jsr      _LVOOpenLibrary(a6) ; Apre libreria
  39.    move.l   d0,DosBase          ; Memorizza puntatore
  40.    tst.l    d0                  ; Ma esce in caso di errore
  41.    bne      L1
  42.    rts
  43.  
  44. L1 lea      IntuitionName,a1    ; A1 = nome Intuition
  45.    clr.l    d0                  ; D0 = 0 = qualunque versione di libreria
  46.    movea.l  AbsExecBase,a6      ; A6 = base libreria Exec
  47.    jsr      _LVOOpenLibrary(a6) ; Apriti Sesamo
  48.    move.l   d0,IntuiBase        ; Ma esce se errore
  49.    tst.l    d0                  
  50.    beq      error
  51.  
  52.    lea      GraphicsName,a1     ; Apre libreria grafica
  53.    clr.l    d0
  54.    movea.l  AbsExecBase,a6
  55.    jsr      _LVOOpenLibrary(a6)
  56.    move.l   d0,GraphicsBase
  57.    tst.l    d0
  58.    beq      error
  59.  
  60. * Le seguenti linee provvedono ad aprire una finestra per l'output
  61. * La funzione è OpenWindow(), con A0 indicante l'indirizzo della
  62. * struttura NewWindow di definizione delle caratteristiche della
  63. * finestra ed A6 il vettore base della libreria Intuition.
  64.  
  65.    movea.l  IntuiBase,a6
  66.    lea      MyNewWindow,a0
  67.    jsr      _LVOOpenWindow(a6)
  68.    tst.l    d0
  69.    beq      error
  70.    move.l   d0,MyWindow
  71.  
  72. * Le seguenti linee usano SetWindowTitles() di Intuition per scrivere
  73. * il titolo della finestra, memorizzato in fondo al listato
  74.  
  75.    move.l   d0,a0
  76.    lea      WindowTitle,a1
  77.    lea      ScreenTitle,a2
  78.    movea.l  IntuiBase,a6
  79.    jsr      _LVOSetWindowTitles(a6)
  80.  
  81. * Qui inizia il nocciolo del programma. So garantisce che vi siano
  82. * gli spazi nella stringa di output e non le vecchie cifre
  83.  
  84. DisplayMem:
  85.    move.l   #$20202020,d3        ; Quattro spazi ASCII
  86.    move.l   d3,ChipCount+6
  87.    move.l   d3,ChipCount+10
  88.    move.l   d3,FastCount+6
  89.    move.l   d3,FastCount+10
  90.    
  91. * Ora leggiamo tramite funzione AvailMem() di Exec la memoria FAST
  92. * e CHIP libera, stampando i risultati in ASCII
  93.  
  94.    movea.l  AbsExecBase,a6
  95.    moveq    #MEMF_FAST,d1
  96.    jsr      _LVOAvailMem(a6)    ; D0 = bytes di FAST RAM liberi
  97.    move.l   d0,d4        ; salvati in D4
  98.    lea      FastCount+15,a0
  99.    jsr      Convert             ; Subroutine universale di conversione
  100.  
  101.    movea.l  AbsExecBase,a6
  102.    moveq.l  #MEMF_CHIP,d1       ; D0 = bytes di CHIP RAM liberi
  103.    jsr      _LVOAvailMem(a6)
  104.    add.l    d0,d4               ; salvati in D4
  105.    cmpi.l   #$C000,d4            ; Se RAM <48K ci suicidiamo
  106.    ble        Suicide
  107.    lea      ChipCount+15,a0
  108.    jsr      Convert
  109.  
  110. * Ora abbiamo la stringa di testo corretta ed a posto
  111. * Posizioniamo il cursore per la scrittura nella finestra
  112. * Si usa la funzione Move() di Graphics dopo avere messo in A1
  113. * l'indirizzo della RastPort associata alla finestra, ricavato
  114. * dalla struttura Window creata da OpenWindow(), della quale
  115. * è stato restituito il puntatore.
  116.  
  117.    movea.l  GraphicsBase,a6
  118.    move.l   MyWindow,a2
  119.    move.l   wd_RPort(a2),a1
  120.    moveq    #17,d1              ; Posizione desiderata
  121.    moveq    #6,d0
  122.    jsr      _LVOMove(a6)
  123.  
  124. * Scriviamo la I stringa tramite Text() di Graphics.library
  125.  
  126.    movea.l  GraphicsBase,a6
  127.    move.l   MyWindow,a2
  128.    move.l   wd_RPort(a2),a1
  129.    lea      FastCount,a0
  130.    moveq    #15,d0              ; Lunghezza stringa
  131.    jsr      _LVOText(a6)
  132.  
  133. * Scriviamo la II stringa tramite Text() di Graphics
  134. * Ancora usiamo Move(RP, x=D1, y=D0) per posizionare il cursore
  135.  
  136.    movea.l  GraphicsBase,a6
  137.    move.l   MyWindow,a2
  138.    move.l   wd_RPort(a2),a1
  139.    moveq    #27,d1              ; Dove vogliamo scrivere
  140.    moveq    #6,d0
  141.    jsr      _LVOMove(a6)
  142.  
  143.    movea.l  GraphicsBase,a6
  144.    move.l   MyWindow,a2
  145.    move.l   wd_RPort(a2),a1
  146.    lea      ChipCount,a0
  147.    moveq    #15,d0              ; Lunghezza stringa
  148.    jsr      _LVOText(a6)
  149.  
  150.    movea.l  DosBase,a6
  151.    moveq    #100,d1             ; Task a nanna per 2 secondi
  152.    jsr      _LVODelay(a6)
  153.  
  154. * Qui si attende che l'utente click sul gadget di chiusura della
  155. * finestra per terminare. Si ricava la porta per messaggi ed
  156. * attendiamo un qualunque mssaggio tramite GetMsg(), in quanto
  157. * l'unico che può pervenire è quello di CLOSEWINDOW.
  158. * Se nullo, ripetiamo ciclo di lettura e visualizzazione memoria.
  159. * Il task usa non molto intensamente la CPU in quanto la chiamata
  160. a Delay() precedente gli fa trascorrere la maggior parte del tempo
  161. * a riposo, se si considera il breve istante di ricalcolo dei valori
  162. * della CHIP e FAST RAM libere.
  163.  
  164.    move.l   MyWindow,a0         ; A0 = struttura di finestra
  165.    move.l   wd_UserPort(a0),a0  ; Ricaviamo indirizzo porta
  166.    movea.l  AbsExecBase,a6
  167.    jsr      _LVOGetMsg(a6)      ; GetMsg(a0=Porta)
  168.    tst.l    d0                  ; Nulla di clickato
  169.    beq      DisplayMem          ; ricalcoliamo
  170.  
  171. * Clickato gadget di chiusura. Si chiude la finestra e si termina.
  172. * Usiamo ovviamente CLoseWindow() di Inuition.
  173.  
  174. exit:
  175.    movea.l  IntuiBase,a6
  176.    movea.l  MyWindow,a0
  177.    jsr      _LVOCloseWindow(a6)
  178.  
  179. * Le seguenti linee carantiscono un'uscita pulita dal programma
  180. * anche in caso di errore.
  181.  
  182. error:
  183.    movea.l  AbsExecBase,a6
  184.    move.l   IntuiBase,a1
  185.    jsr      _LVOCloseLibrary(a6) ; Non sarebbe necessario...
  186.    clr.l    d1             ; Ritorniamo al CLI sempre zero
  187.    jsr        _LVOExit(a6)     ; Richiamiamo Exit() di Exec
  188.    clr.l    d0                   ; Exit() riporta qui. Ora ritorniamo.
  189.    rts
  190.  
  191. * Qui si arriva in caso di necessita di suicidio del task.
  192. * Ciò si verifica in caso di ristrettezza di RAM, ad evitare GURU.
  193. * La procedura non è il massimo dell'eleganza, ma quando si è a corto
  194. * di RAM non si può andare molto per il sottile.
  195.  
  196. Suicide:
  197.     lea    0,a0
  198.     movea.l    IntuiBase,a6
  199.     jsr    _LVODisplayBeep(a6) 
  200.     bra    exit    ; Now leave
  201.  
  202. * La seguente routine è facilmente trasportabile, provvedendo
  203. * a convertire un numero in stringa ASCII:
  204. * Input : indirizzo buffer di output in A0, dato in D0
  205. * Output: stringa ASCII numerica all'indirizzo di A0 iniziale
  206.  
  207. Convert:
  208.    move.l   d0,d1        ; Dividere per 10 una long può dare overflow
  209.    andi.l   #$FFFF0000,d1
  210.    swap     d1
  211.  
  212. nextdigit:
  213.    divu     #10,d1
  214.    move.w   d1,d2         ; La parte più alta del numero
  215.    ext.l    d2
  216.    andi.l   #$FFFF0000,d1
  217.    andi.l   #$0000FFFF,d0
  218.    add.l    d1,d0
  219.    divu     #10,d0
  220.    swap     d0
  221.    addi.b   #48,d0        ; Il byte basso ora contiene la cifra
  222.    move.b   d0,-(a0)      ; Copia nella stringa in buffer
  223.    swap d0                ; Riporta il numero
  224.    andi.l   #$0000FFFF,d0 ; Maschera cifra
  225.    move.l   d2,d1         ; Pone la parte alta dove ci serve
  226.    add.l    d0,d2         ; D2 è perdibile, verifichiamo per la fine
  227.    bne      nextdigit
  228.    rts
  229.  
  230. * Qui inizia la sezione dei dati. Si potrebbe marcare con una direttiva
  231. * SECTION del compilatore, ma data la brevità del codice soprassediamo.
  232.  
  233.                cnop 0,4
  234. MyWindow:      dc.l 0
  235. MyFlags        EQU SMART_REFRESH!WINDOWDEPTH!WINDOWDRAG!WINDOWCLOSE
  236. MyNewWindow:   dc.w 0,30,132,30
  237.                dc.b 1,2          ; Colori
  238.                dc.l CLOSEWINDOW  ; Flags di IDCMP
  239.                dc.l MyFlags
  240.                dc.l 0,0
  241.                dc.l WindowTitle
  242.                dc.l 0            ; Puntatore a schermo custom nullo
  243.                dc.l 0            ; Puntatore a bitmap custom nulla
  244.                dc.w 0,0,0,0      ; Non ridimensionabile, limiti nulli
  245.                dc.w WBENCHSCREEN ; Tipo di schermo
  246.  
  247.                cnop 0,4
  248. WindowTitle:   dc.b 'Memory:', 0
  249. ScreenTitle    dc.b 'Assembly Language is fun!', 0
  250. IntuitionName: dc.b 'intuition.library', 0
  251. GraphicsName:  dc.b 'graphics.library', 0,0
  252. DosName:       dc.b 'dos.library', 0
  253. ChipCount:     dc.b 'Chip:          ', 0
  254. FastCount:     dc.b 'Fast:          ', 0
  255.  
  256.                cnop 0,4
  257. DosBase:       dc.l 0
  258. IntuiBase      dc.l 0
  259. GraphicsBase   dc.l 0
  260.                end
  261.  
  262. ******************************** FINE DEL FILE ************************
  263.